home *** CD-ROM | disk | FTP | other *** search
/ Computer Shopper 242 / Issue 242 - April 2008 - DPCS0408DVD.ISO / Software Money Savers / VirtualDub / Source / VirtualDub-1.7.7-src.7z / src / h / vd2 / system / file.h < prev    next >
Encoding:
C/C++ Source or Header  |  2007-10-13  |  9.2 KB  |  315 lines

  1. //    VirtualDub - Video processing and capture application
  2. //    System library component
  3. //    Copyright (C) 1998-2004 Avery Lee, All Rights Reserved.
  4. //
  5. //    Beginning with 1.6.0, the VirtualDub system library is licensed
  6. //    differently than the remainder of VirtualDub.  This particular file is
  7. //    thus licensed as follows (the "zlib" license):
  8. //
  9. //    This software is provided 'as-is', without any express or implied
  10. //    warranty.  In no event will the authors be held liable for any
  11. //    damages arising from the use of this software.
  12. //
  13. //    Permission is granted to anyone to use this software for any purpose,
  14. //    including commercial applications, and to alter it and redistribute it
  15. //    freely, subject to the following restrictions:
  16. //
  17. //    1.    The origin of this software must not be misrepresented; you must
  18. //        not claim that you wrote the original software. If you use this
  19. //        software in a product, an acknowledgment in the product
  20. //        documentation would be appreciated but is not required.
  21. //    2.    Altered source versions must be plainly marked as such, and must
  22. //        not be misrepresented as being the original software.
  23. //    3.    This notice may not be removed or altered from any source
  24. //        distribution.
  25.  
  26. #ifndef f_VD2_SYSTEM_FILE_H
  27. #define f_VD2_SYSTEM_FILE_H
  28.  
  29. #ifdef _MSC_VER
  30.     #pragma once
  31. #endif
  32.  
  33. #include <limits.h>
  34. #include <stdarg.h>
  35. #include <vd2/system/vdtypes.h>
  36. #include <vd2/system/vdalloc.h>
  37. #include <vd2/system/vdstl.h>
  38. #include <vector>
  39.  
  40. #ifdef WIN32
  41.     typedef void *VDFileHandle;                // this needs to match wtypes.h definition for HANDLE
  42. #else
  43.     #error No operating system target declared??
  44. #endif
  45.  
  46. namespace nsVDFile {
  47.     enum eSeekMode {
  48.         kSeekStart=0, kSeekCur, kSeekEnd
  49.     };
  50.  
  51.     enum eFlags {
  52.         kRead            = 0x00000001,
  53.         kWrite            = 0x00000002,
  54.         kReadWrite        = kRead | kWrite,
  55.  
  56.         kDenyNone        = 0x00000000,
  57.         kDenyRead        = 0x00000010,
  58.         kDenyWrite        = 0x00000020,
  59.         kDenyAll        = kDenyRead | kDenyWrite,
  60.  
  61.         kOpenExisting        = 0x00000100,
  62.         kOpenAlways            = 0x00000200,
  63.         kCreateAlways        = 0x00000300,
  64.         kCreateNew            = 0x00000400,
  65.         kTruncateExisting    = 0x00000500,        // not particularly useful, really
  66.         kCreationMask        = 0x0000FF00,
  67.  
  68.         kSequential            = 0x00010000,
  69.         kRandomAccess        = 0x00020000,
  70.         kUnbuffered            = 0x00040000,        // much faster on Win32 thanks to the crappy cache, but possibly bad in Unix?
  71.         kWriteThrough        = 0x00080000,
  72.  
  73.         kAllFileFlags        = 0xFFFFFFFF
  74.     };
  75. };
  76.  
  77. class VDFile {
  78. protected:
  79.     VDFileHandle    mhFile;
  80.     vdautoptr2<wchar_t>    mpFilename;
  81.     sint64            mFilePosition;
  82.  
  83. private:
  84.     VDFile(const VDFile&);
  85.     const VDFile& operator=(const VDFile& f);
  86.  
  87. public:
  88.     VDFile() : mhFile(NULL) {}
  89.     VDFile(const char *pszFileName, uint32 flags = nsVDFile::kRead | nsVDFile::kDenyWrite | nsVDFile::kOpenExisting);
  90.     VDFile(const wchar_t *pwszFileName, uint32 flags = nsVDFile::kRead | nsVDFile::kDenyWrite | nsVDFile::kOpenExisting);
  91.     VDFile(VDFileHandle h);
  92.     ~VDFile();
  93.  
  94.     // The "NT" functions are non-throwing and return success/failure; the regular functions throw exceptions
  95.     // when something bad happens.
  96.  
  97.     void    open(const char *pszFileName, uint32 flags = nsVDFile::kRead | nsVDFile::kDenyWrite | nsVDFile::kOpenExisting);    // false if failed due to not found or already exists
  98.     void    open(const wchar_t *pwszFileName, uint32 flags = nsVDFile::kRead | nsVDFile::kDenyWrite | nsVDFile::kOpenExisting);    // false if failed due to not found or already exists
  99.     bool    closeNT();
  100.     void    close();
  101.     bool    truncateNT();
  102.     void    truncate();
  103.  
  104.     // extendValid() pushes the valid threshold of a file out, so that the system allocates
  105.     // space for a file without ensuring that it is cleared.  It is mainly useful for
  106.     // preallocating a file without waiting for the system to clear all of it.  The caveats:
  107.     //
  108.     // - only required on NTFS
  109.     // - requires Windows XP or Windows Server 2003
  110.     // - does not work on compressed or sparse files
  111.     //
  112.     // As such, it shouldn't normally be relied upon, and extendValidNT() should be the call
  113.     // of choice.
  114.     //
  115.     // enableExtendValid() must be called beforehand, as SeVolumeNamePrivilege must be
  116.     // enabled on the process before the file is opened!
  117.  
  118.     bool    extendValidNT(sint64 pos);
  119.     void    extendValid(sint64 pos);
  120.     static bool enableExtendValid();
  121.  
  122.     sint64    size();
  123.     void    read(void *buffer, long length);
  124.     long    readData(void *buffer, long length);
  125.     void    write(const void *buffer, long length);
  126.     long    writeData(const void *buffer, long length);
  127.     bool    seekNT(sint64 newPos, nsVDFile::eSeekMode mode = nsVDFile::kSeekStart);
  128.     void    seek(sint64 newPos, nsVDFile::eSeekMode mode = nsVDFile::kSeekStart);
  129.     bool    skipNT(sint64 delta);
  130.     void    skip(sint64 delta);
  131.     sint64    tell();
  132.  
  133.     bool    isOpen();
  134.     VDFileHandle    getRawHandle();
  135.  
  136.     const wchar_t *getFilenameForError() const { return mpFilename; }
  137.  
  138.     // unbuffered I/O requires aligned buffers ("unbuffers")
  139.     static void *AllocUnbuffer(size_t nBytes);
  140.     static void FreeUnbuffer(void *p);
  141.  
  142. protected:
  143.     void    open_internal(const char *pszFilename, const wchar_t *pwszFilename, uint32 flags);
  144. };
  145.  
  146. ///////////////////////////////////////////////////////////////////////////
  147.  
  148. template<class T>
  149. class VDFileUnbufferAllocator {
  150. public:
  151.     typedef    size_t        size_type;
  152.     typedef    ptrdiff_t    difference_type;
  153.     typedef    T*            pointer;
  154.     typedef    const T*    const_pointer;
  155.     typedef    T&            reference;
  156.     typedef    const T&    const_reference;
  157.     typedef    T            value_type;
  158.  
  159.     template<class U> struct rebind { typedef VDFileUnbufferAllocator<U> other; };
  160.  
  161.     pointer            address(reference x) const            { return &x; }
  162.     const_pointer    address(const_reference x) const    { return &x; }
  163.  
  164.     pointer            allocate(size_type n, void *p = 0)    { return (pointer)VDFile::AllocUnbuffer(n * sizeof(T)); }
  165.     void            deallocate(pointer p, size_type n)    { VDFile::FreeUnbuffer(p); }
  166.     size_type        max_size() const throw()            { return MAX_INT; }
  167.  
  168.     void            construct(pointer p, const T& val)    { new((void *)p) T(val); }
  169.     void            destroy(pointer p)                    { ((T*)p)->~T(); }
  170.  
  171. #if defined(_MSC_VER) && _MSC_VER < 1300
  172.     char *            _Charalloc(size_type n)                { return (char *)allocate((n + sizeof(T) - 1) / sizeof(T)); }
  173. #endif
  174. };
  175.  
  176. ///////////////////////////////////////////////////////////////////////////
  177.  
  178. class IVDStream {
  179. public:
  180.     virtual const wchar_t *GetNameForError() = 0;
  181.     virtual sint64    Pos() = 0;
  182.     virtual void    Read(void *buffer, sint32 bytes) = 0;
  183.     virtual sint32    ReadData(void *buffer, sint32 bytes) = 0;
  184. };
  185.  
  186. class IVDRandomAccessStream : public IVDStream {
  187. public:
  188.     virtual sint64    Length() = 0;
  189.     virtual void    Seek(sint64 offset) = 0;
  190. };
  191.  
  192. class VDFileStream : public VDFile, public IVDRandomAccessStream {
  193. private:
  194.     VDFileStream(const VDFile&);
  195.     const VDFileStream& operator=(const VDFileStream& f);
  196.  
  197. public:
  198.     VDFileStream() {}
  199.     VDFileStream(const char *pszFileName, uint32 flags = nsVDFile::kRead | nsVDFile::kDenyWrite | nsVDFile::kOpenExisting)
  200.         : VDFile(pszFileName, flags) {}
  201.     VDFileStream(const wchar_t *pwszFileName, uint32 flags = nsVDFile::kRead | nsVDFile::kDenyWrite | nsVDFile::kOpenExisting)
  202.         : VDFile(pwszFileName, flags) {}
  203.     VDFileStream(VDFileHandle h) : VDFile(h) {}
  204.     ~VDFileStream();
  205.  
  206.     const wchar_t *GetNameForError();
  207.     sint64    Pos();
  208.     void    Read(void *buffer, sint32 bytes);
  209.     sint32    ReadData(void *buffer, sint32 bytes);
  210.     sint64    Length();
  211.     void    Seek(sint64 offset);
  212. };
  213.  
  214. class VDMemoryStream : public IVDRandomAccessStream {
  215. public:
  216.     VDMemoryStream(const void *pSrc, uint32 len);
  217.  
  218.     const wchar_t *GetNameForError();
  219.     sint64    Pos();
  220.     void    Read(void *buffer, sint32 bytes);
  221.     sint32    ReadData(void *buffer, sint32 bytes);
  222.     sint64    Length();
  223.     void    Seek(sint64 offset);
  224.  
  225. protected:
  226.     const char        *mpSrc;
  227.     const uint32    mLength;
  228.     uint32            mPos;
  229. };
  230.  
  231. class VDBufferedStream : public IVDRandomAccessStream {
  232. public:
  233.     VDBufferedStream(IVDRandomAccessStream *pSrc, uint32 bufferSize);
  234.     ~VDBufferedStream();
  235.  
  236.     const wchar_t *GetNameForError();
  237.     sint64    Pos();
  238.     void    Read(void *buffer, sint32 bytes);
  239.     sint32    ReadData(void *buffer, sint32 bytes);
  240.  
  241.     sint64    Length();
  242.     void    Seek(sint64 offset);
  243.  
  244.     void    Skip(sint64 size);
  245.  
  246. protected:
  247.     IVDRandomAccessStream *mpSrc;
  248.     vdblock<char>    mBuffer;
  249.     sint64        mBasePosition;
  250.     uint32        mBufferOffset;
  251.     uint32        mBufferValidSize;
  252. };
  253.  
  254. class VDTextStream {
  255. public:
  256.     VDTextStream(IVDStream *pSrc);
  257.     ~VDTextStream();
  258.  
  259.     const char *GetNextLine();
  260.  
  261. protected:
  262.     IVDStream    *mpSrc;
  263.     uint32        mBufferPos;
  264.     uint32        mBufferLimit;
  265.     enum {
  266.         kFetchLine,
  267.         kEatNextIfCR,
  268.         kEatNextIfLF
  269.     } mState;
  270.  
  271.     enum {
  272.         kFileBufferSize = 4096
  273.     };
  274.  
  275.     vdfastvector<char>    mLineBuffer;
  276.     vdblock<char>        mFileBuffer;
  277. };
  278.  
  279. class VDTextInputFile {
  280. public:
  281.     VDTextInputFile(const wchar_t *filename, uint32 flags = nsVDFile::kOpenExisting);
  282.     ~VDTextInputFile();
  283.  
  284.     inline const char *GetNextLine() {
  285.         return mTextStream.GetNextLine();
  286.     }
  287.  
  288. protected:
  289.     VDFileStream    mFileStream;
  290.     VDTextStream    mTextStream;
  291. };
  292.  
  293. class VDTextOutputFile {
  294. public:
  295.     VDTextOutputFile(const wchar_t *filename, uint32 flags = nsVDFile::kCreateAlways);
  296.     ~VDTextOutputFile();
  297.  
  298.     void Close();
  299.  
  300.     void PutLine(const char *s);
  301.     void FormatLine(const char *format, ...);
  302.  
  303. protected:
  304.     void FormatLine2(const char *format, va_list val);
  305.     void PutData(const char *s, int len);
  306.  
  307.     enum { kBufSize = 4096 };
  308.  
  309.     int            mLevel;
  310.     VDFile        mFile;
  311.     char        mBuf[kBufSize];
  312. };
  313.  
  314. #endif
  315.